# 2021年1月21日星期四 日作业
# 人工智能学院1906A
# 裴云鹏

# 分割线工具函数
def sep(n=32, *, label=''):
    '''
    Util function. Print a line to make command line output salient.
    :param n: Number of hyphens.
    :param label: Optional label
    :return: None
    '''
    n = int(n)
    label = str(label)
    if len(label) == 0:
        print('-' * n)
    else:
        half_n = n // 2
        print('-' * half_n, label, '-' * half_n, sep='')


# 1. 匿名函数和递归函数：（25分）
# 1）写一个匿名函数，x为参数，表示一个人的名字,	功能是输出：
# Ｘ正在完成python作业！
sep(label='1. 1）写一个匿名函数')
f = lambda x: print('{name!s}正在完成python作业！'.format(name=x))
f('裴云鹏')


# 2）用递归函数输出斐波那契数列第15项
sep(label='1. 2）用递归函数输出斐波那契数列第15项')


def fib(n):
    '''
    Get fib number by recursion.

    :param n: The n-th fib number.
    :return: The fib number.
    '''
    if n <= 0:
        return 0
    elif 1 <= n <= 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)


# test
# for i in range(1, 15 + 1):
#     print(i, fib(i))
print('斐波那契数列第15项是：{}'.format(fib(15)))


# 2.写一个三角形图案生成的函数并调用，名称为triangle(n)：其中参数n代表图案有多少行（25分）
sep(label='2.写一个三角形图案生成的函数并调用')


def triangle(n):
    '''
    Print a triangle in command line output.

    :param n: How many lines of asterisks.
    :return: None
    '''
    for i in range(1, n + 1):
        for j in range(1, i + 1):
            print('*', end='')
        print()


triangle(4)

# 3.定义一个get_money函数，（25分）
#
# 1）含有关键字可变长参数**kwargs
# 2）查看kwargs的数据类型
# 3）遍历kwargs中的所有值，并全部放入列表mylist中
# 4）遍历kwargs中的所有键值对
# 5）（此问选做，不做硬性要求）如果函数调用传递；的值中有salary,（即包含姓名name，年龄age，工资salary），则打印这个人信息的姓名，年龄，工资，如果没有salary,则只打印姓名
# 调用这个函数：get_money(name=’刘一’,age=18,salary=24K)
sep(label='3.定义一个get_money函数')


def get_money(**kwargs):
    '''
    A function just for exercise.

    :param kwargs: Variable keyword parameters.
    :return: None
    '''
    # 2）查看kwargs的数据类型
    print('Type of kwargs:', type(kwargs))
    # 3）遍历kwargs中的所有值，并全部放入列表mylist中
    mylist = []
    for v in kwargs.values():
        mylist.append(v)
    # 4）遍历kwargs中的所有键值对
    for k, v in kwargs.items():
        print('\t', k, '\t=>', v)
    # 5）（此问选做，不做硬性要求）如果函数调用传递；的值中有salary,（即包含姓名name，年龄age，工资salary），则打印这个人信息的姓名，年龄，工资，如果没有salary,则只打印姓名
    if 'salary' in kwargs:
        print('姓名：{}, 年龄：{}, 工资：{}'.format(kwargs['name'], kwargs['age'], kwargs['salary']))
    else:
        print('姓名：{}'.format(kwargs['name']))


# 调用这个函数：get_money(name=’刘一’,age=18,salary=24K)
get_money(name='刘一', age=18, salary='24K')
get_money(name='刘一', age=18)

# 4.定义函数实现如下功能：（25分）
# 1)不断地输入数字，输入b退出，将输入的所有数字返回
# 2)调用该函数，然后打印出以下内容：总和是多少  有多少个  平均是多少
sep(label='4.定义函数')


def xinput_numbers():
    '''定义函数实现如下功能：
不断地输入数字，输入b退出，将输入的所有数字返回
调用该函数，然后打印出以下内容：总和是多少  有多少个  平均是多少
'''
    xlist = []
    while True:
        ch = input('Integer? ("b" for quit): ').strip()
        if 'b' == ch:
            break
        xlist.append(int(ch))
    xlen = len(xlist)
    if 0 == xlen:
        print('No integers at all!')
        return
    xsum = 0
    for i in xlist:
        xsum += i
    xave = xsum / xlen
    print('''\
Sum: {},
Count: {},
Average: {}
'''.format(xsum, xlen, xave))
    return xlist


xinputs = xinput_numbers()
print('Inputed numbers:', xinputs)
